#include "music.h"
music::music(const QUrl &url)
: isLike(false)
, isHistory(false)
, musicUrl(url)
{
    musicId = QUuid::createUuid().toString();
    parseMediaMetaData();
}
music::music() {}
void music::setIsLike(bool isLike)
{
    this->isLike = isLike;
}
void music::setIsHistory(bool isHistory)
{
    this->isHistory = isHistory;
}
void music::setMusicName(const QString &musicName)
{
    this->musicName = musicName;
}
void music::setSingerName(const QString &singerName)
{
    this->singerName = singerName;
}
void music::setAlbumName(const QString &albumName)
{
    this->albumName = albumName;
}
void music::setDuration(const qint64 duration)
{
    this->duration = duration;
}
void music::setMusicUrl(const QUrl &url)
{
    this->musicUrl = url;
}
void music::setMusicId(const QString &musicId)
{
    this->musicId = musicId;
}
bool music::getIsLike()
{
    return isLike;
}
bool music::getIsHistory()
{
    return isHistory;
}
QString music::getMusicName()
{
    return musicName;
}
QString music::getSingerName()
{
    return singerName;
}
QString music::getAlbumName()
{
    return albumName;
}
qint64 music::getDuration()
{
    return duration;
}
QUrl music::getMusicUrl()
{
    return musicUrl;
}
QString music::getMusicId()
{
    return musicId;
}

QString music::getLrcFilePath() const
{
    // ⾳频⽂件和LRC⽂件在⼀个⽂件夹下
    // 直接将⾳频⽂件的后缀替换为.lrc
    QString path = musicUrl.toLocalFile();
    path.replace(".mp3", ".lrc");
    path.replace(".flac", ".lrc");
    path.replace(".mpga", ".lrc");
    return path;
}

void music::insertMusicToDB()
{
    // 1. 检测music是否在数据库中存在
    QSqlQuery query;
    // 当SELECT 1...查询到结果后，我们需要知道是否存在
    // SELECT EXISTS(⼦查询) ： ⼦查询中如果有记录，SELECT EXISTS返回TRUE
    // 如果⼦查询中没有满⾜条件的记录， SELECT EXISTS返回FALS
    query.prepare("SELECT EXISTS (SELECT 1 FROM MusicInfo WHERE musicId = ?)");
    query.addBindValue(musicId);
    if(!query.exec())
    {
    qDebug()<<"查询失败: "<<query.lastError().text();
    return;
    }
    if(query.next())
    {
    bool isExists = query.value(0).toBool();
    if(isExists)
    {
    // musicId的歌曲已经存在
        // 2. 存在：不需要再插⼊musci对象，此时只需要将isLike和isHistory属性进⾏更新
        query.prepare("UPDATE MusicInfo SET isLike = ?, isHistory = ?WHERE musicId = ?");
        query.addBindValue(isLike? 1 : 0);
        query.addBindValue(isHistory? 1 : 0);
        query.addBindValue(musicId);
        if(!query.exec())
        {
        qDebug()<<"更新失败: "<<query.lastError().text();
        }
        qDebug()<<"更新music信息: "<<musicName<<" "<<musicId;
        }
        else
        {
        // 3. 不存在：直接将music的属性信息插⼊数据库
        query.prepare("INSERT INTO MusicInfo(musicId, musicName,singerName, albumName, musicUrl,\
        duration, isLike, isHistory)\
        VALUES(?,?,?,?,?,?,?,?)");
        query.addBindValue(musicId);
        query.addBindValue(musicName);
        query.addBindValue(singerName);
        query.addBindValue(albumName);
        query.addBindValue(musicUrl.toLocalFile());
        query.addBindValue(duration);
        query.addBindValue(isLike ? 1 : 0);
        query.addBindValue(isHistory? 1 : 0);
        if(!query.exec())
        {
        qDebug()<<"插入失败: "<<query.lastError().text();
        return;
        }
        qDebug()<<"插入music信息: "<<musicName<<" "<<musicId;
        }
        }
}
void music::parseMediaMetaData()
{
    // 解析时候需要读取歌曲数据，读取歌曲⽂件需要⽤到QMediaPlayer类
    QMediaPlayer player;
    player.setMedia(musicUrl);
    // 媒体元数据解析需要时间，只有等待解析完成之后，才能提取⾳乐信息，此处循环等待
    // 循环等待时：主界⾯消息循环就⽆法处理了，因此需要在等待解析期间，让消息循环继续处理
    while(!player.isMetaDataAvailable())
    {
        QCoreApplication::processEvents();
    }
    // 解析媒体元数据结束，提取元数据信息
    if(player.isMetaDataAvailable())
    {
        musicName = player.metaData("Title").toString();
        singerName = player.metaData("Author").toString();
        albumName = player.metaData("AlbumTitle").toString();
        duration = player.duration();
        QString fileName = musicUrl.fileName();
        // 找-的位置
        int index = fileName.indexOf('-');
        if(musicName.isEmpty())
        {
            if(index != -1)
            {
            // "2002年的第⼀场雪 - ⼑郎.mp3"
            musicName = fileName.mid(0, index).trimmed();
            }
            else
            {
            // "2002年的第⼀场雪.mp3"
            musicName = fileName.mid(0, fileName.indexOf('.')).trimmed();
            }
        }
        if(singerName.isEmpty())
        {
            if(index != -1)
            {
           singerName= fileName.mid(index+1, fileName.indexOf('.')-index-
            1).trimmed();
            }
            else
            {
           singerName = "未知歌⼿";
            }
        }
        if(albumName.isEmpty())
        {
            albumName = "专辑名未知";
        }
        qDebug()<<musicName<<" "<<singerName<<" "<<albumName<<" "<<duration;
    }

}
